package com.ruoyi.college.service.impl;

import java.util.Arrays;
import java.util.List;
import java.util.Map;
import cn.hutool.core.util.ObjectUtil;
import com.mybatisflex.core.paginate.Page;
import com.mybatisflex.core.query.QueryMethods;
import com.mybatisflex.core.query.QueryWrapper;
import com.mybatisflex.core.update.UpdateChain;
import com.ruoyi.common.core.utils.MapstructUtils;
import com.ruoyi.common.core.utils.StringUtils;
import com.ruoyi.common.orm.core.page.PageQuery;
import com.ruoyi.common.orm.core.page.TableDataInfo;
import com.ruoyi.common.orm.core.service.impl.BaseServiceImpl;
import com.ruoyi.common.core.utils.DateUtils;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.ruoyi.college.mapper.CollegeUserMapper;
import com.ruoyi.college.domain.CollegeUser;
import com.ruoyi.college.domain.bo.CollegeUserBo;
import com.ruoyi.college.domain.vo.CollegeUserVo;
import com.ruoyi.college.service.ICollegeUserService;
import static com.ruoyi.college.domain.table.CollegeUserTableDef.COLLEGE_USER;

/**
 * 用户信息，用于记录用户基本信息Service业务层处理
 *
 * @author AlanZheng
 * 2025-03-29
 */
@Service
public class CollegeUserServiceImpl extends BaseServiceImpl<CollegeUserMapper, CollegeUser> implements ICollegeUserService
{
    @Resource
    private CollegeUserMapper collegeUserMapper;

    @Override
    public QueryWrapper query() {
        return super.query().from(COLLEGE_USER);
    }

    private QueryWrapper buildQueryWrapper(CollegeUserBo collegeUserBo) {
        QueryWrapper queryWrapper = super.buildBaseQueryWrapper();
        queryWrapper.and(COLLEGE_USER.USERNAME.like(collegeUserBo.getUsername()));
        queryWrapper.and(COLLEGE_USER.NICKNAME.like(collegeUserBo.getNickname()));
        queryWrapper.and(COLLEGE_USER.USER_CODE.eq(collegeUserBo.getUserCode()));
        queryWrapper.and(COLLEGE_USER.ROLE.eq(collegeUserBo.getRole()));
        queryWrapper.and(COLLEGE_USER.EMAIL.eq(collegeUserBo.getEmail()));
        queryWrapper.and(COLLEGE_USER.PASSWORD.eq(collegeUserBo.getPassword()));

        return queryWrapper;
    }

    /**
     * 查询用户信息，用于记录用户基本信息
     *
     * @param id 用户信息，用于记录用户基本信息主键
     * @return 用户信息，用于记录用户基本信息
     */
    @Override
    public CollegeUserVo selectById(Long id)
    {
        return this.getOneAs(query().where(COLLEGE_USER.ID.eq(id)), CollegeUserVo.class);

    }

    /**
     * 查询用户信息，用于记录用户基本信息列表
     *
     * @param collegeUserBo 用户信息，用于记录用户基本信息Bo
     * @return 用户信息，用于记录用户基本信息集合
     */
    @Override
    public List<CollegeUserVo> selectList(CollegeUserBo collegeUserBo)
    {
        QueryWrapper queryWrapper = buildQueryWrapper(collegeUserBo);
        return this.listAs(queryWrapper, CollegeUserVo.class);
    }

    /**
     * 分页查询用户信息，用于记录用户基本信息列表
     *
     * @param collegeUserBo 用户信息，用于记录用户基本信息Bo
     * @return 分页用户信息，用于记录用户基本信息集合
     */
    @Override
    public TableDataInfo<CollegeUserVo> selectPage(CollegeUserBo collegeUserBo)
    {
        QueryWrapper queryWrapper = buildQueryWrapper(collegeUserBo);
        Page<CollegeUserVo> page = this.pageAs(PageQuery.build(), queryWrapper, CollegeUserVo.class);
        return TableDataInfo.build(page);
    }

    /**
     * 新增用户信息，用于记录用户基本信息
     *
     * @param collegeUserBo 用户信息，用于记录用户基本信息Bo
     * @return 结果:true 操作成功，false 操作失败
     */
    @Override
    public boolean insert(CollegeUserBo collegeUserBo)
    {
        CollegeUser collegeUser = MapstructUtils.convert(collegeUserBo, CollegeUser.class);


        return this.save(collegeUser);//使用全局配置的雪花算法主键生成器生成ID值
    }

    /**
     * 新增用户信息，用于记录用户基本信息，前台提供主键值，一般用于导入的场合
     *
     * @param collegeUserBo 用户信息，用于记录用户基本信息Bo
     * @return 结果:true 操作成功，false 操作失败
     */
    @Override
    public boolean insertWithPk(CollegeUserBo collegeUserBo)
    {
        CollegeUser collegeUser = MapstructUtils.convert(collegeUserBo, CollegeUser.class);


            return collegeUserMapper.insertWithPk(collegeUser) > 0;//前台传来主键值
    }

    /**
     * 修改用户信息，用于记录用户基本信息
     *
     * @param collegeUserBo 用户信息，用于记录用户基本信息Bo
     * @return 结果:true 更新成功，false 更新失败
     */
    @Override
    public boolean update(CollegeUserBo collegeUserBo)
    {
        CollegeUser collegeUser = MapstructUtils.convert(collegeUserBo, CollegeUser.class);
        if(ObjectUtil.isNotNull(collegeUser) && ObjectUtil.isNotNull(collegeUser.getId())) {
            boolean updated = this.updateById(collegeUser);
            return updated;
        }
        return false;
    }


    /**
     * 批量删除用户信息，用于记录用户基本信息
     *
     * @param ids 需要删除的用户信息，用于记录用户基本信息主键集合
     * @return 结果:true 删除成功，false 删除失败
     */
    @Transactional
    @Override
    public boolean deleteByIds(Long[] ids)
    {
        return this.removeByIds(Arrays.asList(ids));
    }

}
